#ifndef __ICM45686_H__
#define __ICM45686_H__

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "spi.h"
#include "gpio.h"
#include "usart.h"
#include "main.h"

/*寄存器地址定义*/
#define WHO_AM_I 0x72      // 读取芯片ID寄存器地址
#define PWR_MGMT_1 0x10    // 电源管理寄存器地址，配置工作模式
#define ACCEL_CONFIG0 0x1B // 加速度计配置寄存器地址
#define GYRO_CONFIG0 0x1C  // 陀螺仪配置寄存器地址
#define INT1_CONFIG 0x16   // 中断配置寄存器地址
#define ACCEL_DATA_XH 0x00
#define ACCEL_DATA_XL 0x01 // 加速度计X轴数据寄存器地址
#define ACCEL_DATA_YH 0x02
#define ACCEL_DATA_YL 0x03 // 加速度计Y轴数据寄存器地址
#define ACCEL_DATA_ZH 0x04
#define ACCEL_DATA_ZL 0x05 // 加速度计Z轴数据寄存器地址
#define GYRO_DATA_XH 0x06
#define GYRO_DATA_XL 0x07 // 陀螺仪X轴数据寄存器地址
#define GYRO_DATA_YH 0x08
#define GYRO_DATA_YL 0x09 // 陀螺仪Y轴数据寄存器地址
#define GYRO_DATA_ZH 0x0A
#define GYRO_DATA_ZL 0x0B     // 陀螺仪Z轴数据寄存器地址
#define GYRO_SRC_CTRL 0xA6    // 抗混叠滤波器与插值采样控制寄存器地址
#define ACCEL_SRC_CTRL 0x7B   // 抗混叠滤波器与插值采样控制寄存器地址
#define INTF_CONFIG_OVRD 0x2D // 接口配置寄存器地址，选择SPI/I2C等
#define SOFT_RESET_ADDR 0x7F  // 复位寄存器地址，复位所有寄存器

/*寄存器值定义*/
#define GYRO_MODE_LN 0x0C      // 陀螺仪低噪声模式
#define ACCEL_MODE_LN 0x03     // 加速度计低噪声模式
#define ACCEL_4G_100hz 0x39    // 加速度计量程±4g 数据刷新速率100Hz
#define GYRO_500dps_100hz 0x39 // 陀螺仪量程±500dps 数据刷新速率100Hz
#define DEVICE_ID 0xE9         // 设备ID寄存器值，ICM-45686的ID为0xE9
#define GYRO_FIR_InTERP 0x02   // 陀螺仪抗混叠滤波器与插值采样控制寄存器值，开启抗混叠滤波器和插值采样
#define ACCEL_FIR_InTERP 0x02  // 加速度计抗混叠滤波器与插值采样控制寄存器值，开启抗混叠滤波器和插值采样
#define SPI_MODE 0x0E          // 4线SPI模式3
#define ICM_RESET 0x02         // 复位寄存器值，复位所有寄存器
#define INT_CONFIG 0x02        // 中断配置寄存器值，配置中断引脚的工作模式

/*缩放因子*/
#define ACCEL_SCALE_4G 8192.0f
#define GYRO_SCALE_500DPS 65.5f

/*函数声明*/
void ICM45686_Init(void);        // 初始化函数
void ICM45686_CS_Select(void);   // 选择SPI片选引脚
void ICM45686_CS_Deselect(void); // 取消选择SPI片选引脚
void ICM45686_decodedata(int16_t *accel_data, int16_t *gyro_data); // 读取加速度计和陀螺仪数据函数
void ICM45686_ReadData(uint8_t addr, uint8_t *data); // 读取寄存器数据函数

#endif
